/*
 * Fizyka.cpp
 *
 *  Created on: 2009-12-11
 *      Author: morek
 */

#include "Fizyka.h"

using namespace cv;


Fizyka::Fizyka(int begx, int begy, int bspeed,int skala2) {
	rekord = 0;
	stan=0;
	skala=skala2;
	dzielnik=4;
	mx = 0;
	score = 0;
	my = 0;
	x = begx;
	y = begy;
	speedX = 0;
	speedY = bspeed;
	ball = Ball();
	posX = 100;
	posY = 200;
	speed1X = 0;
	speed1Y = 0;
	counter = 0;
	for(int i=0;i<4;i++)bounce[i]=1;
}

Fizyka::Fizyka() {
	rekord = 0;
	dzielnik=2;
	for(int i=0;i<4;i++)bounce[i]=1;
	mx = 0;
	score = 0;
	my = 0;
	stan=0;
	x = 100;
	y = 100;
	speedX = 0;
	speedY = 10;
	ball = Ball();
	posX = 100;
	posY = 200;
	speed1X = 0;
	speed1Y = 0;
	counter = 0;
}

Fizyka::~Fizyka() {
	// TODO Auto-generated destructor stub
}
void Fizyka::draw(CvArr* img, int maxy, int maxx, CvBox2D *znacz) {

	int ballSize = 30;

	int xsy[2], yki[2];
	int odleglosc;
	int odxdox, i, width;
	speed1X = lastPosX - posX;
	if (lastPosY - posY > 0)
		speed1Y = lastPosY - posY;
	if (speed1Y > 30 || speed1Y < -40)
		speed1Y = 0;
	if (speed1X > 40 || speed1X < -40)
		speed1X = 0;
	//speed1X = abs(speed1X * 0.8);
	//speed1Y = abs(speed1Y * 0.8);

	for (i = 0; i < 4; i++) {

		if (znacz[i].size.width > znacz[i].size.height) {
			width = znacz[i].size.width;
			xsy[0] = (znacz[i].center.x - znacz[i].size.width / 2) * skala;
			yki[0] = (znacz[i].center.y - znacz[i].size.height / 4) * skala;
			xsy[1] = (znacz[i].center.x - znacz[i].size.width / 2) * skala;
			yki[1] = (znacz[i].center.y + znacz[i].size.height / 4) * skala;
		} else {
			width = znacz[i].size.height;
			yki[0] = (znacz[i].center.y - znacz[i].size.width / 3) * skala;
			xsy[0] = (znacz[i].center.x - znacz[i].size.height / 2) * skala;
			yki[1] = (znacz[i].center.y - znacz[i].size.width / 3) * skala;
			xsy[1] = (znacz[i].center.x + znacz[i].size.height / 2) * skala;
		}
		/*cvLine(img, cvPoint(xsy[0], yki[0]), cvPoint(xsy[1], yki[1]),
				CV_RGB(220,220,220), 1, CV_AA, 0);*/
		if (counter > 0)
			counter--;
		if (x + ballSize > xsy[0] && x - ballSize < xsy[1]) {
			odleglosc = (yki[0] - y);
			//printf("Odl: %d width=%f height=%f\n", odleglosc,	znacz[i].size.width, znacz[i].size.height);
			fflush(stdout);
		} else
			odleglosc = 1000;
		//printf("Odl: %d  ", odleglosc);
		if (odleglosc <= ballSize && counter == 0 && y - ballSize < yki[0]&&bounce[i]==1&&speedY>=0) {
			score++;
			if (x < znacz[i].center.x * skala)
				odxdox = (float) abs(znacz[i].center.x * skala - x);
			else
				odxdox = (float) abs(x - znacz[i].center.x * skala);
			float odl = (float) ((float) (odxdox) / (float) ((xsy[1] - xsy[0]
					+ 2 * ballSize) / 2));

			if (x > znacz[i].center.x * skala)
				posX = x + ballSize * odl;
			else
				posX = x - ballSize * odl;
			posY = y + ballSize - ballSize * (float) (x - znacz[i].center.x
					- znacz[i].size.width / 4) / znacz[i].size.width / 4;
			//printf("Odleglosc: %f x: %d, posX: %d", odl, x, posX);
			speedY = -speedY;
			if (posX > x) {
				//printf("speedY: %d speedX: %d \n znacznik: speedX: %d, speedY: %d\n", speedY, speedX,speed1X,speed1Y);
				speedY -= speed1Y / 2;

				speedY = cos(odl * 3.14) * speedY;
				speedX -= sin(odl * 3.14) * speedY;
				//printf("speed2Y: %d speedX2: %d \n", speedY, speedX);
			} else {
				//printf("speedY: %d speedX: %d \n znacznik: speedX: %d, speedY: %d\n", speedY, speedX,speed1X,speed1Y);
				speedY -= speed1Y / 2;
				speedY = cos(odl * 3.14) * speedY;
				speedX += sin(odl * 3.14) * speedY;
			}
			speedY = speedY * 0.9;

			if (posX > x) {

				speedX -= ((float) 1 - abs((float) posY - (float) y)
						/ (float) 30) * speed1X;
				speedY -= ((float) ((float) posY - (float) y) / (float) 30)
						* speedX;
			} else {

				speedX -= ((float) 1 - abs((float) posY - (float) y)
						/ (float) 30) * speed1X;
				speedY -= ((float) ((float) posY - (float) y) / (float) 30)
						* speedX;
			}
			speedX = speedX * 0.7;
			counter = 30;
		}
		lastPosX = posX;
		lastPosY = posY;
		if (speedY >= 0)
			speedY++;
		if (speedY < 0)
			speedY++;
		if(y>yki[0]+ballSize)bounce[i]=0;
		if(y<yki[0])bounce[i]=1;
		//ball.drawBall(img, xsy[0], yki[0], ballSize, 1);
		//ball.drawBall(img, xsy[1], yki[1], ballSize, 1);
	}
	if (stan==20)
		ball.drawBall(img, x, y, ballSize, 1);
	if (x + ballSize >= maxx) {
		speedX = -speedX;
		x = maxx - ballSize;
	}
	if (x - ballSize <= 0) {
		speedX = -speedX;
		x = 1 + ballSize;
	}
	if (y - ballSize <= 0) {
		speedY = -speedY;
		y = 1 + ballSize;
	}
	if (y + ballSize >= maxy) {
		stan=10;
		if (score > rekord)
			rekord = score;
		speedY = -speedY * 0.8;
		y = maxy - ballSize;
	}

	x = x + speedX/dzielnik;
	y = y + speedY/dzielnik;
}

